#ifndef GRAPH_H
#define GRAPH_H
#include <iostream>
#include "graphtypes.h"

using namespace std;

class Graph
{
protected :
  summit_t summit_nb;
  edges_t edges_nb; //Nombre total d'arêtes

public :
  Graph();
  Graph(Graph &);
  Graph(summit_t n, edges_t m);
  virtual ~Graph();
  virtual void fill();
  virtual bool areConnected(summit_t i, summit_t j) const = 0;
  virtual void connect(summit_t i, summit_t j) = 0;
  virtual void deconnect(summit_t i, summit_t j) = 0;
  virtual vector<summit_t> * getNeighbours(summit_t v) const;
  //virtual vector<summit_t> * isNeighbourOf(summit_t v) const;
  virtual edges_t degreeOf(summit_t) const;
  virtual summit_t getSummitNb() const;
  virtual void setSummitNb(summit_t n);
  virtual edges_t getEdgesNb() const;
  virtual void setEdgesNb(edges_t m);
  virtual vector<summit_t> * shortestPath(summit_t i, summit_t j) const;
  virtual vector<summit_t> * shortestPath() const;
  virtual vector<summit_t> * onePath(summit_t i, summit_t j) const;
  virtual vector<summit_t> * onePath() const;
  //virtual void printGraph()const =0;
};
#endif
